package com.atguigu.gmall.order.biz;

import com.atguigu.gmall.enums.OrderStatus;
import com.atguigu.gmall.enums.ProcessStatus;
import com.atguigu.gmall.order.entity.OrderInfo;
import com.atguigu.gmall.order.vo.OrderConfirmVo;
import com.atguigu.gmall.order.vo.OrderSubmitVo;
import com.atguigu.gmall.ware.WareStockMsg;
import com.atguigu.gmall.ware.WareStockResultMsg;

import java.util.List;

/**
 * @author lfy
 * @Description
 * @create 2022-10-19 11:45
 */
public interface OrderBizService {

    //比较并设置：
    //期望的值：1
    //修改的值：2

    /**
     *
     * @param expectOrderStatus   期望的订单状态
     * @param expectProcessStatus 期望的处理状态
     * @param orderStatus         修改成的订单状态
     * @param processStatus       修改成的处理状态
     * @param orderId             订单id
     * @param userId              用户id
     */
    void changeOrderStatusByCAS(List<OrderStatus> expectOrderStatus,
                                List<ProcessStatus> expectProcessStatus,
                                OrderStatus orderStatus,
                                ProcessStatus processStatus,
                                Long orderId,
                                Long userId);

    /**
     * 获取订单确认页数据
     * @return
     */
    OrderConfirmVo getOrderConfirmData();

    /**
     * 关闭订单
     * @param orderId
     */
    void closeOrder(Long orderId,Long userId);


    /**
     * 提交订单数据
     * @param submitVo
     * @param tradeNo
     * @return
     */
    Long submitOrder(OrderSubmitVo submitVo, String tradeNo);

    /**
     * 根据前端提交来的合法数据，进行订单保存
     * @param submitVo
     * @param tradeNo
     * @return
     */
    Long saveOrder(OrderSubmitVo submitVo,String tradeNo);

    /**
     * 查询订单数据
     * @param orderId
     * @param userId
     * @return
     */
    OrderInfo getOrderInfo(Long orderId, Long userId);

    /**
     * 修改订单为已支付
     * @param json
     */
    void updateOrderStatusPayed(String json);

    /**
     * 根据库存扣减结果修改订单状态
     * @param resultMsg
     */
    void updateOrderStatusByStockResult(WareStockResultMsg resultMsg);

    /**
     * 根据库存系统发来的 商品库存分布情况进行拆单
     * @param orderId
     * @param wareSkuMapJson
     * @return
     */
    List<WareStockMsg> splitOrder(Long orderId, String wareSkuMapJson);

    /**
     * 保存秒杀单
     * @param orderSubmitVo
     * @return
     */
    Long saveSeckillOrder(OrderInfo orderSubmitVo);
}
